home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 684 / 684.xpi / chrome / fireftp.jar / content / js / connection / fxp.js < prev    next >
Text File  |  2009-02-19  |  11KB  |  295 lines

  1. function fxp(account) {
  2.   gFxp      = new ftpMozilla(fxpObserver);
  3.   gFxpFiles = new Array();
  4.  
  5.   for (var x = 0; x < gSiteManager.length; ++x) {
  6.     if (gSiteManager[x].account == account) {
  7.       var site            = gSiteManager[x];
  8.       gFxp.type           = 'fxp';
  9.       gFxp.fxpHost        = gFtp;
  10.       gFxp.host           = site.host;
  11.       gFxp.port           = site.port;
  12.       gFxp.security       = site.security;
  13.       gFxp.login          = site.login;
  14.       gFxp.password       = site.password;
  15.       gFxp.ipType         = site.ipmode ? "IPv6" : "IPv4";
  16.       gFxp.setEncoding    (site.encoding || "UTF-8");
  17.       gFxp.initialPath    = site.remotedir ? site.remotedir : '';
  18.  
  19.       gFxp.fileMode       = gPrefs.getIntPref ("filemode");
  20.       gFxp.hiddenMode     = gPrefs.getBoolPref("hiddenmode");
  21.       gFxp.proxyHost      = gPrefs.getComplexValue("proxyhost", Components.interfaces.nsISupportsString).data;
  22.       gFxp.proxyPort      = gPrefs.getIntPref ("proxyport");
  23.       gFxp.proxyType      = gPrefs.getCharPref("proxytype");
  24.       gFxp.activePortMode = gPrefs.getBoolPref("activeportmode");
  25.       gFxp.activeLow      = gPrefs.getIntPref ("activelow");
  26.       gFxp.activeHigh     = gPrefs.getIntPref ("activehigh");
  27.       gFxp.useCompression = gPrefs.getBoolPref("compressmode");
  28.       gFxp.reconnectMode  = false;
  29.       gFxp.keepAliveMode  = false;
  30.  
  31.       var asciiList = gPrefs.getComplexValue("asciifiles", Components.interfaces.nsISupportsString).data;
  32.       asciiList     = asciiList.split(",");
  33.       for (var x = 0; x < asciiList.length; ++x) {
  34.         gFxp.asciiFiles.push(asciiList[x]);
  35.       }
  36.  
  37.       gFxp.errorConnectStr = gStrbundle.getString("errorConn");
  38.       gFxp.errorXCheckFail = gStrbundle.getString("errorXCheckFail");
  39.       gFxp.passNotShown    = gStrbundle.getString("passNotShown");
  40.       gFxp.l10nMonths      = gStrbundle.getString("months").split("|");
  41.       break;
  42.     }
  43.   }
  44.  
  45.   for (var x = 0; x < remoteTree.rowCount; ++x) {
  46.     if (remoteTree.selection.isSelected(x)) {
  47.       gFxpFiles.push(remoteTree.data[x]);
  48.     }
  49.   }
  50.  
  51.   fxpConnect();
  52. }
  53.  
  54. function fxpConnect(showPassDialog) {
  55.   gFxp.host = gFxp.host.replace(/^ftp:\/*/, '');                            // error checking - get rid of 'ftp://'
  56.  
  57.   if (gFxp.host && gFxp.host.charAt(gFxp.host.length - 1) == '/') {
  58.     gFxp.host = gFxp.host.substring(0, gFxp.host.length - 1);
  59.   }
  60.  
  61.   if (!gFxp.host) {                                                         // need to fill in the host
  62.     doAlert(gStrbundle.getString("alertFillHost"));
  63.     return;
  64.   }
  65.  
  66.   if (!gFxp.port || !parseInt(gFxp.port)) {                                 // need a valid port
  67.     doAlert(gStrbundle.getString("alertFillPort"));
  68.     return;
  69.   }
  70.  
  71.   if (!gFxp.login || !gFxp.password || showPassDialog) {                    // get a password if needed
  72.     var passwordObject       = new Object();
  73.     passwordObject.login     = gFxp.login;
  74.     passwordObject.password  = gFxp.password;
  75.     passwordObject.returnVal = false;
  76.  
  77.     window.openDialog("chrome://fireftp/content/password.xul", "password", "chrome,modal,dialog,resizable,centerscreen", passwordObject);
  78.  
  79.     if (passwordObject.returnVal) {
  80.       gFxp.login    = passwordObject.login;
  81.       gFxp.password = passwordObject.password;
  82.     } else {
  83.       return;
  84.     }
  85.   }
  86.  
  87.   $('remoteFXP').disabled = true;
  88.  
  89.   gFxp.connect();
  90. }
  91.  
  92. var fxpObserver = {
  93.   securityCallbacks   : securityCallbacks,
  94.  
  95.   onConnectionRefused : function()                   { displayWelcomeMessage(gFxp.welcomeMessage); },
  96.   onWelcomed          : function()                   { displayWelcomeMessage(gFxp.welcomeMessage); },
  97.   onConnected         : function()                   { },
  98.   onLoginDenied       : function()                   { fxpConnect(true); },
  99.   onDisconnected      : function()                   {
  100.     try {
  101.       if (connectedButtonsDisabler) {                                       // connectedButtonsDisabler could be gone b/c we're disposing
  102.         $('remoteFXP').disabled = false;
  103.       }
  104.     } catch (ex) { }
  105.   },
  106.   onReconnecting      : function()                   { },
  107.   onAbort             : function()                   {
  108.     if (gFxp.isConnected) {
  109.       gFxp.disconnect();
  110.     }
  111.   },
  112.   onError             : function(msg)                {
  113.     error('[FXP] ' + msg, false, true);
  114.  
  115.     gFtp.abort(true);
  116.  
  117.     if (gFxp.isConnected) {
  118.       gFxp.disconnect();
  119.     }
  120.   },
  121.   onDebug             : function(msg, level)         { debug('[FXP] ' + msg, level, true); },
  122.   onAppendLog         : function(msg, css, type)     { appendLog('[FXP] ' + msg, css, type, true); },
  123.   onShouldRefresh     : function(local, remote, dir) { },
  124.   onDirNotFound       : function(buffer)             { },
  125.   onLoginAccepted     : function(newHost)            { },
  126.   onTransferFail      : function(params, reason)     { },
  127.   onChangeDir         : function(path, dontUpdateView, skipRecursion) { },
  128.   onIsReadyChange     : function(state) {
  129.     if (gFxpFiles && state && gFxp.isConnected && !gFxp.eventQueue.length) {
  130.       var transferObj = new fxpTransfer();
  131.       var files       = gFxpFiles;
  132.       gFxpFiles       = null;
  133.  
  134.       gFxp.beginCmdBatch();
  135.       for (var x = 0; x < files.length; ++x) {
  136.         transferObj.start(files[x]);
  137.  
  138.         if (transferObj.cancel) {
  139.           return;
  140.         }
  141.       }
  142.       gFxp.endCmdBatch();
  143.     }
  144.   }
  145. };
  146.  
  147. function fxpTransfer() {
  148.   this.prompt  = true;
  149.   this.skipAll = false;
  150.   this.cancel  = false;
  151.   this.busy    = false;
  152. }
  153.  
  154. fxpTransfer.prototype = {
  155.   start : function(aFile, aHostParent, aDestParent, aHostListData, aDestListData) {
  156.     if (!gFxp.isConnected || !gFtp.isConnected || this.cancel) {
  157.       return;
  158.     }
  159.  
  160.     if (this.busy) {                                                        // we're doing locking, sort of, see below
  161.       var self = this;
  162.       var currentHostListData = aHostListData ? aHostListData : cloneArray(gFtp.listData);
  163.       var currentDestListData = aDestListData ? aDestListData : cloneArray(gFxp.listData);
  164.       var func = function() { self.start(aFile, aHostParent, aDestParent, currentHostListData, currentDestListData); };
  165.       setTimeout(func, 250);
  166.       return;
  167.     }
  168.  
  169.     var hostParent   = aHostParent ? aHostParent : aFile.parent;
  170.     var destParent   = aDestParent ? aDestParent : gFxp.currentWorkingDir;
  171.     var files        = new Array();
  172.     var resume;
  173.     var hostListData = aHostListData ? aHostListData : gFtp.listData;
  174.     var destListData = aDestListData ? aDestListData : gFxp.listData;
  175.  
  176.     if (gNoPromptMode) {                                                    // overwrite dialog is disabled, do overwrites
  177.       this.prompt = false;
  178.     }
  179.  
  180.     if (aFile) {                                                            // populate the files variable with what we're transfering
  181.       files.push(aFile);
  182.     } else {
  183.       files = hostListData;                                                 // if recursive
  184.     }
  185.  
  186.     for (var x = 0; x < files.length; ++x) {
  187.       var fileName = files[x].leafName;
  188.       var hostPath = files[x].path;
  189.       var destPath = gFxp.constructPath(destParent, fileName);
  190.       var file     = { exists: function() { return false; } };              // check to see if file exists
  191.  
  192.       for (var y = 0; y < destListData.length; ++y) {
  193.         if (destListData[y].leafName == fileName) {
  194.           file = { fileSize: destListData[y].fileSize, lastModifiedTime: destListData[y].lastModifiedTime, leafName: fileName, exists: function() { return true; },
  195.                    isDir: destListData[y].isDirectory(), isDirectory: function() { return this.isDir } };
  196.           break;
  197.         }
  198.       }
  199.  
  200.       if (this.skipAll && file.exists() && !file.isDirectory()) {
  201.         continue;
  202.       }
  203.  
  204.       resume = false;
  205.  
  206.       if (file.exists() && this.prompt && !files[x].isDirectory()) {
  207.         resume = file.fileSize < files[x].fileSize && gFxp.detectAscii(hostPath) != 'A';  // ask nicely if file exists
  208.  
  209.         var params = { response         : 0,
  210.                        fileName         : destPath,
  211.                        resume           : true,
  212.                        replaceResume    : !resume,
  213.                        existingSize     : file.fileSize,
  214.                        existingDate     : file.lastModifiedTime,
  215.                        newSize          : files[x].fileSize,
  216.                        newDate          : files[x].lastModifiedTime,
  217.                        timerEnable      : !gDisableDestructMode };
  218.  
  219.         this.busy = true;                                                   // ooo, the fun of doing semi-multi-threaded stuff in firefox
  220.                                                                             // we're doing some 'locking' above
  221.  
  222.         window.openDialog("chrome://fireftp/content/confirmFile.xul", "confirmFile", "chrome,modal,dialog,resizable,centerscreen", params);
  223.  
  224.         this.busy = false;
  225.  
  226.         if (params.response == 1) {
  227.           resume       = false;
  228.         } else if (params.response == 2) {
  229.           this.prompt  = false;
  230.           resume       = false;
  231.         } else if ((params.response == 3) || (params.response == 0)) {
  232.           continue;
  233.         } else if (resume && params.response == 4) {
  234.           resume       = true;
  235.         } else if (!resume && params.response == 4) {
  236.           this.cancel  = true;
  237.           gFxp.abort();
  238.           gFtp.abort();
  239.           break;
  240.         } else if (params.response == 5) {
  241.           this.skipAll = true;
  242.           continue;
  243.         }
  244.       }
  245.  
  246.       if (files[x].isDirectory()) {                                         // if the directory doesn't exist we create it
  247.         if (!file.exists()) {
  248.           gFxp.makeDirectory(destPath);
  249.           var currentDestListData = new Array();
  250.           gFxp.listData = currentDestListData;                              // we know the new directory is empty
  251.           this.fxpHelper2(hostPath, destPath, currentDestListData);
  252.         } else {
  253.           this.fxpHelper(hostPath, destPath);
  254.         }
  255.       } else {
  256.         gFxp.fxp(hostPath, destPath, resume, resume ? file.fileSize : -1, files[x].fileSize);
  257.       }
  258.     }
  259.  
  260.     var self = this;
  261.     var func = function() { self.doneCheck(); };
  262.     setTimeout(func, 500);
  263.   },
  264.  
  265.   fxpHelper : function(hostPath, destPath) {
  266.     var self = this;
  267.     var func = function() {                                                 // we use fxpHelper b/c if we leave it inline the closures will apply
  268.       var currentDestListData = cloneArray(gFxp.listData);
  269.       gFxp.removeCacheEntry(destPath);
  270.       self.fxpHelper2(hostPath, destPath, currentDestListData);
  271.     };
  272.     gFxp.list(destPath, func, true, false, true);
  273.   },
  274.  
  275.   fxpHelper2 : function(hostPath, destPath, destListData) {
  276.     var self = this;
  277.     var func = function() {                                                 // we use fxpHelper b/c if we leave it inline the closures will apply
  278.       var currentHostListData = cloneArray(gFtp.listData);
  279.       self.start('', hostPath, destPath, currentHostListData, destListData);
  280.     };
  281.     gFtp.list(hostPath, func, true, false, true);
  282.   },
  283.  
  284.   doneCheck : function() {
  285.     if (!gFxp.isConnected || !gFxp.fxpHost || this.busy) {
  286.       return;
  287.     }
  288.  
  289.     if ((!gFxp.eventQueue.length && !gFxp.fxpHost.eventQueue.length)
  290.      || (!gFxp.eventQueue.length &&  gFxp.fxpHost.eventQueue[0].callback2 != 'fxp' && gFxp.fxpHost.eventQueue[0].callback2 != 'fxpList')) {
  291.       gFxp.disconnect();
  292.     }
  293.   }
  294. };
  295.